package br.com.sebrae.pr.sgp.util;

import java.math.BigDecimal;
import java.util.Date;

import org.apache.commons.lang3.StringUtils;

/**
 * Classe com métodos úteis para conversão dos dados retornados pelas pesquisas ao banco de dados.
 * 
 * @author Tanaka
 * 
 */
public class ConversionUtil {

    /**
     * Retorna Long.parseLong(o.toString()) ou zero se 0 for nulo ou não numérico
     * 
     * @param o
     * @return
     */
    public static long getLong(final Object o) {
        if (o == null || !StringUtils.isNumeric(o.toString())) {
            return 0l;
        }
        return Long.parseLong(o.toString());
    }

    /**
     * Retorna Integer.parseInt(o.toString()) ou zero se 0 for nulo ou não numérico
     * 
     * @param o
     * @return
     */
    public static int getInt(final Object o) {
        if (o == null || !StringUtils.isNumeric(o.toString())) {
            return 0;
        }
        return Integer.parseInt(o.toString());
    }

    /**
     * Retorna new Date(((java.sql.Timestamp) o).getTime()), nulo se o for nulo ou ocorrer algum erro
     * 
     * @param o
     * @return
     */
    public static Date getDate(final Object o) {
        if (o == null) {
            return null;
        }
        try {
            if (o instanceof java.sql.Timestamp) {
                return new Date(((java.sql.Timestamp) o).getTime());
            }
        } catch (Exception e) {
        }
        return null;
    }

    /**
     * Retorna true se o.toString() for igual � "true" ou "1"
     * 
     * @param o
     * @return
     */
    public static boolean getBoolean(final Object o) {
        if (o == null || StringUtils.isBlank(o.toString())) {
            return false;
        }
        return "true".equalsIgnoreCase(o.toString()) || "1".equalsIgnoreCase(o.toString());
    }

    /**
     * Retorna o.toString() se o != null, senão retorna null.
     * 
     * @param o
     * @return
     */
    public static String getString(final Object o, final String vlrIfNull) {
        if (o == null) {
            return vlrIfNull;
        }
        return o.toString();
    }

    /**
     * Retorna o.toString() se o != null, senão retorna null.
     * 
     * @param o
     * @return
     */
    public static String getString(final Object o) {
        return getString(o, null);
    }

    /**
     * Retorna um BigDecimal representando o valor de dado objeto.
     * 
     * @param o
     * @return
     */
    public static BigDecimal getBigDecimal(final Object o) {
        if (o == null) {
            return null;
        }
        if (o instanceof BigDecimal) {
            return (BigDecimal) o;
        }
        String str = o.toString();
        if (StringUtils.isNotBlank(str)) {
            str = str.replaceAll("\\.", "").replaceAll(",", ".");
            return new BigDecimal(str.trim());
        }
        return new BigDecimal("0");
    }

    public static Character getChar(final Object o) {
        final String s = getString(o);
        if (StringUtils.isBlank(s)) {
            return null;
        }
        return s.charAt(0);
    }

}
